home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / jrh-rkrm-partone / preferences / showprefs.e < prev   
Text File  |  1995-03-26  |  5KB  |  138 lines

  1. -> showprefs.e - Parse and show some info from an IFF Preferences file
  2. -> E-Note: ignore the rubbish (in the C version) about startup code
  3.  
  4. MODULE 'iffparse',
  5.        'devices/timer',
  6.        'dos/dos',
  7.        'graphics/text',
  8.        'libraries/iffparse',
  9.        'prefs/font',
  10.        'prefs/icontrol',
  11.        'prefs/input',
  12.        'prefs/overscan',
  13.        'prefs/printergfx',
  14.        'prefs/printertxt',
  15.        'prefs/prefhdr',
  16.        'prefs/screenmode',
  17.        'prefs/serial'
  18.  
  19. ENUM ERR_NONE, ERR_IFF, ERR_LIB, ERR_OPEN, ERR_RDARGS, TOTAL_ERRS
  20.  
  21. -> E-Note: the use of exceptions is carefully balanced
  22. RAISE ERR_IFF    IF AllocIFF()=NIL,
  23.       ERR_LIB    IF OpenLibrary()=NIL,
  24.       ERR_OPEN   IF Open()=NIL,
  25.       ERR_RDARGS IF ReadArgs()=NIL
  26.  
  27. PROC main() HANDLE
  28.   DEF readargs=NIL, rargs[2]:ARRAY OF LONG, iffhandle=NIL:PTR TO iffhandle,
  29.       filename=NIL, error, rc=RETURN_OK, iffErrTxt:PTR TO LONG
  30.  
  31.   iffparsebase:=OpenLibrary('iffparse.library', 37)
  32.  
  33.   readargs:=ReadArgs('FILE/A', rargs, NIL)
  34.   IF filename:=rargs[0]
  35.     -> Allocate an IFF handle
  36.     iffhandle:=AllocIFF()
  37.     -> Open the file for reading
  38.     iffhandle.stream:=Open(filename, OLDFILE)
  39.     -> Initialise the iff handle
  40.     InitIFFasDOS(iffhandle)
  41.     IF (error:=OpenIFF(iffhandle, IFFF_READ))=0
  42.       PropChunk(iffhandle, ID_PREF, ID_PRHD)
  43.  
  44.       PropChunk(iffhandle, ID_PREF, ID_FONT)
  45.       PropChunk(iffhandle, ID_PREF, ID_ICTL)
  46.       PropChunk(iffhandle, ID_PREF, ID_INPT)
  47.       PropChunk(iffhandle, ID_PREF, ID_OSCN)
  48.       PropChunk(iffhandle, ID_PREF, ID_PGFX)
  49.       PropChunk(iffhandle, ID_PREF, ID_PTXT)
  50.       PropChunk(iffhandle, ID_PREF, ID_SCRM)
  51.       PropChunk(iffhandle, ID_PREF, ID_SERL)
  52.  
  53.       -> E-Note: handle the funny loop more cleanly using a separate procedure
  54.       REPEAT
  55.       UNTIL error:=parse(iffhandle)
  56.     ENDIF
  57.     CloseIFF(iffhandle)
  58.     IF error<>IFFERR_EOF
  59.       iffErrTxt:=['EOF', 'EOC', 'no lexical scope', 'insufficient memory',
  60.                   'stream read error','stream write error','stream seek error',
  61.                   'file corrupt', 'IFF syntax error', 'not an IFF file',
  62.                   'required call-back hook missing', NIL]
  63.       WriteF('\s: \s\n', rargs[], iffErrTxt[-error-1])
  64.       rc:=RETURN_FAIL
  65.     ENDIF
  66.   ENDIF
  67. EXCEPT DO
  68.   SELECT TOTAL_ERRS OF exception
  69.   CASE ERR_OPEN, ERR_RDARGS
  70.     error:=IoErr()
  71.     SetIoErr(error)
  72.     IF error
  73.       rc:=RETURN_FAIL
  74.       PrintFault(error, IF filename THEN filename ELSE '')
  75.     ENDIF
  76.   CASE ERR_IFF; WriteF('Can''t allocate IFF handle\n')
  77.   CASE ERR_LIB; WriteF('Can''t open iffparse.library\n')
  78.   ENDSELECT
  79.   IF iffhandle THEN FreeIFF(iffhandle)
  80.   IF readargs THEN FreeArgs(readargs)
  81.   IF iffparsebase THEN CloseLibrary(iffparsebase)
  82. ENDPROC rc
  83.  
  84. -> E-Note: handle the funny loop more cleanly using a separate procedure
  85. PROC parse(iffhandle)
  86.   DEF ifferror, sp:PTR TO storedproperty, hdrsp, cnode:PTR TO contextnode
  87.   IF ifferror:=ParseIFF(iffhandle, IFFPARSE_STEP)
  88.     RETURN IF ifferror=IFFERR_EOC THEN 0 ELSE ifferror
  89.   ENDIF
  90.  
  91.   -> Do nothing if this is a PrefHeader chunk; we'll pop it later when there
  92.   -> is a pref chunk.
  93.   IF cnode:=CurrentChunk(iffhandle)
  94.     IF (cnode.id=ID_PRHD) OR (cnode.id=ID_FORM) THEN RETURN 0
  95.   ENDIF
  96.  
  97.   -> Get the preferences header, stored previously
  98.   hdrsp:=FindProp(iffhandle, ID_PREF, ID_PRHD)
  99.  
  100.   IF sp:=FindProp(iffhandle, ID_PREF, ID_FONT)
  101.     WriteF('FrontPen:  \d\n', sp.data::fontprefs.frontpen)
  102.     WriteF('BackPen:   \d\n', sp.data::fontprefs.backpen)
  103.     WriteF('Font:      \s\n', sp.data::fontprefs.name)
  104.     WriteF('YSize:     \d\n', sp.data::fontprefs.textattr.ysize)
  105.     WriteF('Style:     \d\n', sp.data::fontprefs.textattr.style)
  106.     WriteF('Flags:     \d\n', sp.data::fontprefs.textattr.flags)
  107.   ELSEIF sp:=FindProp(iffhandle, ID_PREF, ID_ICTL)
  108.     WriteF('TimeOut:   \d\n', sp.data::icontrolprefs.timeout)
  109.     WriteF('MetaDrag:  \d\n', sp.data::icontrolprefs.metadrag)
  110.     WriteF('WBtoFront: \d\n', sp.data::icontrolprefs.wbtofront)
  111.     WriteF('FrontToBack: \d\n', sp.data::icontrolprefs.fronttoback)
  112.     WriteF('ReqTrue:   \d\n', sp.data::icontrolprefs.reqtrue)
  113.     WriteF('ReqFalse:  \d\n', sp.data::icontrolprefs.reqfalse)
  114.     -> Etc.
  115.   ELSEIF sp:=FindProp(iffhandle, ID_PREF, ID_INPT)
  116.     WriteF('PointerTicks:      \d\n', sp.data::inputprefs.pointerticks)
  117.     WriteF('DoubleClick/Secs:  \d\n', sp.data::inputprefs.doubleclick.secs)
  118.     WriteF('DoubleClick/Micro: \d\n', sp.data::inputprefs.doubleclick.micro)
  119.     -> Etc.
  120.   ELSEIF sp:=FindProp(iffhandle, ID_PREF, ID_OSCN)
  121.     WriteF('DisplayID: $\h\n', sp.data::overscanprefs.displayid)
  122.     -> Etc.
  123.   ELSEIF sp:=FindProp(iffhandle, ID_PREF, ID_PGFX)
  124.     WriteF('Aspect:    \d\n', sp.data::printergfxprefs.aspect)
  125.     -> Etc.
  126.   ELSEIF sp:=FindProp(iffhandle, ID_PREF, ID_PTXT)
  127.     WriteF('Driver:    \s\n', sp.data::printertxtprefs.driver)
  128.     -> Etc.
  129.   ELSEIF sp:=FindProp(iffhandle, ID_PREF, ID_SCRM)
  130.     WriteF('DisplayID: $\h\n', sp.data::screenmodeprefs.displayid)
  131.     -> Etc.
  132.   ELSEIF sp:=FindProp(iffhandle, ID_PREF, ID_SERL)
  133.     WriteF('BaudRate:  \d\n', sp.data::serialprefs.baudrate)
  134.     -> Etc.
  135.   ENDIF
  136.   RETURN 0
  137. ENDPROC
  138.